04 | 十八般兵器:如何搭建项目所需的开发环境?

讲述:姚秋辰

时长19:08大小17.53M

你好,我是姚秋辰。
工欲善其事,必先利其器。在你跃跃欲试想要进入实战环节前,让我先带你把实战项目需要用到的十八般兵器准备好,也就是搭建好项目的开发环境。
为了避免在项目实战环节碰到一些棘手的兼容性问题,在你开始写代码前就要约定好各个组件的安装版本,包括 Java、Maven 和各个中间件的版本。
我们的微服务实战项目会用到很多中间件,其中也包括了 Spring Cloud 的中心化组件,如 Nacos、Sentinel、Zipkin 和 Seata 等等,这些 Spring Cloud 组件我会放在后面的实战环节边讲解边搭建。
今天我们主要来看下集成开发环境的搭建、数据库的安装和 DB 脚本的导入,此外,我还会手把手带你安装几个通用的中间件。这节课要安装的工具比较多,你一定要耐心看完,不然后面的课程可能会卡壳哦。
闲话少叙,我们现在就开工吧。

环境准备

我推荐你使用 Mac 笔记本或者是 Linux 系统来编写、运行本课程的实战项目,如果你使用的是 Windows 系统,可以尝试做个双系统,或者用 Cygwin、Ubuntu 虚拟机等方式尽量模拟 Linux 环境的开发。一来可以学习 Linux 命令,二来可以尽量保持本地开发环境与线上生产环境的一致,毕竟工作中你所开发的 Java 程序最终还是部署在 Linux 服务器环境。
以下是我在本地 Mac 系统上的安装方式,如果你使用的是 Windows 系统,我也提供了相关组件的官网下载地址,相信对于程序员来说,安装软件是小菜一碟。因为安装的工具比较多,所以我建议你按照课程中介绍的顺序来安装。

Homebrew

Homebrew 是 Mac 系统上的一款非常便利的软件安装工具,可以帮你安装大部分开发工作所需的各种工具软件。这节课中的很多工具,我们也可以使用它来安装。你可以在Homebrew 的官网查看 Homebrew 的详细安装方法。
你可能发现在国内网络下安装 Homebrew 比较缓慢,这里我给你提供两种解决办法:一种是使用 VPN 连接,也就是我们俗称的翻墙,可以大幅提高安装速度;另一种方式是将 Homebrew 指向国内镜像获取安装脚本,替换镜像的命令可以在官方的安装文档中找到。
安装完成之后,你可以在命令行输入 brew -v 命令查看版本信息,来验证安装是否成功:
vincent@LM-SHB-40513998 ~ % brew -v
Homebrew 3.2.17
Homebrew/homebrew-core (git revision 5fbb5bcf8d9; last commit 2021-10-24)
Homebrew/homebrew-cask (git revision b08f2eff16; last commit 2021-10-24)
当 Homebrew 准备就绪,你就可以使用 brew install 命令安装所需要的软件了。在实际工作中,你可以使用清华大学或者中科大的国内镜像源,来大幅提高各软件的下载速度。
在你使用国内镜像源的时候,可能会碰到软件无法安装成功的问题,这往往是因为软件所依赖的某个工具包无法下载,你只要从日志信息中找到卡住安装流程的工具包叫什么,然后使用 brew install xxx 命令(xxx 是工具名称)单独安装这个工具包,之后再重新安装你需要的软件就可以了。这个办法屡试不爽。
安装好 Homebrew 后,我们再来安装 Java 和 Maven。

Java 和 Maven

这两样工具可是我们 Java 工程师吃饭的家伙,安装过程我就不唠叨了。为了避免兼容性的问题,你只要注意安装正确的版本就可以:
Java:推荐使用 JDK8 最新小版本或者 OpenJDK16 的最新小版本(我本地安装的是 OpenJDK 16.0.1)。
Maven:推荐使用 Maven 3.6 或以上的版本(我本地使用 3.8.1 版本)。
由于国内网络访问 Maven 中央仓库比较慢,在编译项目的时候,你会发现下载 Maven 依赖项的时间会比较久,你可以修改 Maven 的 settings.xml 文件,将其默认镜像指向国内的镜像(比如阿里云镜像),这样可以大大加快依赖项下载速度。
安装完 Java 和 Maven 之后,我们再来安装集成开发工具。

IntelliJ IDEA

IntelliJ IDEA 是 JetBrains 全家桶中的一款应用,它是目前公认最强大的 Java 语言开发集成环境。如果你已经受不了 Eclipse 的卡顿,那不妨借此机会转向 IDEA 的怀抱。
你可以在JetBrains 的官网下载 IntelliJ IDEA,IDEA 的免费社区版已经足够你完成复杂的开发任务了。如果你想体验更多的产品功能特性,也可以选择购买商业版 license。要是你有高校教育邮箱(edu 邮箱)就更方便了,你可以使用 edu 邮箱注册 JetBrains 账号,并免费申请商业版使用权用于教学和学习。

Lombok

为了提高编程效率和代码可读性,我在实战项目中还使用了 Lomkok 插件自动生成代码。不过,你需要在自己的开发环境中安装 Lombok 插件,这样你的 IDE 才能识别 Lomkok 的注解。
在 IntelliJ IDEA 中安装 Lombok 非常简单,你只需要在 IDEA 的插件安装界面搜索 Lomkob 这款插件并安装即可,如下图所示:
如果你使用 Eclipse 作为开发工具,需要在 Plugins 界面安装 Lombok 插件,或者将 Lombok 插件的安装文件复制到 Eclipse 安装路径下的 Plugin 文件夹。不管你使用的是 Eclipse 还是 IntelliJ IDEA,记得在装完插件后重启开发环境。
下面,我们再来安装实战项目需要用到的数据库。

MySQL 和 DB 可视化工具

我们的实战课程采用 MySQL 数据库,当然,如果你在本地已经安装了 MariaDB 也是可以的,因为 MariaDB 是 MySQL 的作者参与制作的开源版数据库,它可以全面兼容 MySQL 的功能。
我本地安装的 MySQL 服务器版本为 8.0.27,你可以使用 brew 命令安装最新版的 MySQL,具体命令为:
brew install mysql
当然,你也可以选择从MySQL 官方网站下载安装包,免费的社区版就足以满足我们实战项目的需要。
安装完成之后,我们再使用下面的命令来启动 MySQL:
mysql.server start
待 MySQL 成功安装并启动后,我们来验证一下是否可以登录数据库。在命令行输入:
mysql -uroot -p
然后,我们使用默认的 root 用户登录数据库(密码默认为空),如果你可以在命令行看到以下内容,就表示数据库安装成功。
如果你还没有安装可视化 DB 工具,那么我推荐你使用 DataGrip,它也是 JetBrains 全家桶的一款软件。你可以选择通过DataGrip 官网下载安装包。
下载 DataGrip 并安装成功后,你可以在 DataGrip 中添加一个 MySQL 数据源指向本地 MySQL 数据库,用户名为默认的 root,密码为空,JDBC URL 是 jdbc:mysql://localhost:3306。在添加数据源之前,我们还需要在弹窗界面上点击下载 MySQL Driver:
到这里,MySQL 和 DataGrip 就安装好了。
在开始项目实战之前,我们还需要在 MySQL 中执行数据库建表语句,将实战项目所需要用到的数据库表导入到 MySQL。建表语句所在的 SQL 文件,位于Gitee 项目源代码仓库下的“资源文件”目录中的“Coupon 项目建表语句.sql”文件里。
你可以在数据库命令行中执行 SQL 文件,或者将文件内容 copy 到 DataGrid 中执行。在建表语句的第一行中,我指定了数据库名称为 geekbang_coupon_db,我们在稍后的实战项目中会将这个数据库名称配置在 JDBC URL 中。
CREATE DATABASE IF NOT EXISTS geekbang_coupon_db;
当然,你也可以给这个数据库起一个更响亮的名字,替换掉 SQL 脚本中的名称 geekbang_coupon_db。执行完数据库脚本后,我们再来安装实战项目所需要用到的消息中间件。

安装 RabbitMQ

RabbitMQ 是目前使用最广泛的消息组件之一,在后面的 Spring Cloud 课程中我会使用 Stream 组件搭配 RabbitMQ 发送异步消息。
你可以直接使用下面这个命令安装 RabbitMQ,也可以在RabbitMQ 官网下载安装包。
brew install rabbitmq
我本地安装的 RabbitMQ 版本是 3.9.8,这里我推荐你直接安装 RabbitMQ 最新的稳定版本,因为某些 RabbitMQ 的早期版本缺少必要的插件支持,如果你已经安装了较早年代的 RabbitMQ,可以趁这个机会替换成最新版。
如果你想了解 RabbitMQ 的更多功能特性,RabbitMQ 的官网上提供的技术文档是一个很好的学习途径,你可以去看看。
在安装完成之后,你可以直接通过在命令行执行下面这条代码来启动 RabbitMQ。
rabbitmq-server
如果你是使用安装包安装的话,那么你还需要将 RabbitMQ 的安装路径加入到 PATH 系统变量。成功启动后,你可以在命令行中看到 RabbitMQ 版本和启动成功的日志,这表示 RabbitMQ 后台服务已处于运行状态。
接着,我们在浏览器中打开 RabbitMQ 的本地操作界面http://localhost:15672/,其中的“15672”是 RabbitMQ 启动时的默认窗口。你可以使用默认的内置用户登录系统,用户名和密码都是 guest。顺利登录后你会看到如下页面:
到这里,RabbitMQ 就算是安装好了。下面,我们再来安装最后一个软件,Redis。

安装 Redis

Redis 是一个 key-value 数据库,我们在学习微服务网关的时候将会用 Redis 实现网关层限流。安装 Redis 的方式非常简单,你可以选择使用下面这条命令安装最新版 Redis Brew。
w install redis
当然,你也可以选择从Redis 官网下载源码并在本地完成编译和安装。
安装完成并成功启动 Redis 服务后,我们可以通过命令行验证 Redis 是否运行正常。在命令行直接执行这条命令:
redis-cli
执行完成后,默认情况下会连接到 Redis 的默认地址 localhost:6379,这样我们就来到了 Redis 控制台。
在控制台中,你可以尝试通过 set 命令设置一个 key-value 键值对,并使用 get 命令读取 key 对应的值,通过这种方式来验证 Redis 是否正常工作。在下面的图中,我通过 set 命令设置了一个 key=geekbang,value=955 的键值对,然后使用 get 命令去读取 geekbang 的值。
到这里,我们的工具安装就结束了,后续进入到 Spring Cloud 微服务实战环节的时候,我们还会用到更多的中间件,比如注册中心、微服务网关、链路追踪组件、ELK 日志查询系统、分布式事务协调器等等,到时候我再带你手把手安装这些软件。

总结

今天这节课,我带你安装了编译环境、本地开发环境、MySQL 数据库和一些常用的中间件,这些组件足够我们搭建起一个 Spring Boot 的单体应用了。
环境的安装看似简单,实则遍地是坑,很多兼容性问题就是由于组件版本导致的。我这里给你举两个兼容性问题的例子:
MySQL 版本:不同 MySQL 版本对 JDBC 连接串的要求是不一样的,有的版本需要你在 JDBC URL 中额外指定 Timezone 等信息。你会发现,原先得得好好的应用,某一天升级了数据库之后很可能会挂掉;
Maven 版本:有些 Maven 插件要求高版本的 Maven 支持,有时你会发现在一台电脑上可以编译通过的源码,换了一台电脑可能就编译失败,这很有可能是 Maven 版本的问题。
这些兼容性问题往往都很隐蔽,不好排查。所以呢,才有了程序员圈子里的硬梗“一定是环境问题”。那么,当你碰到一些棘手的异常情况的时候,比如某个应用在没有代码改动的情况下突然不正常了,不妨先抱着怀疑的态度,去检查一下是否有外部环境的变化,比如中间件版本、编译环境等等。
下一讲我将带你体验 Spring Boot 急速落地的过程,和你手把手搭建一个 Spring Boot 实战项目,为后面的 Spring Cloud 章节的学习做好前置功课。

思考题

最后,请你思考两个问题:
你在学习新技术、安装新的组件的过程中,通常都是通过什么途径来摸索的呢?在这个过程中你有哪些提升效率的小窍门(比如使用 homebrew 软件)可以分享吗?
你曾经碰到过最棘手的线上 Bug 或者兼容性问题是什么?最后又是如何被发现并解决的?我们在留言区来一场疑难 Bug 大 Battle 吧!
好啦,这节课就结束啦。欢迎你把这节课分享给更多对 Spring Cloud 感兴趣的朋友。我是姚秋辰,我们下节课再见!
分享给需要的人,Ta订阅后你可得20现金奖励
生成海报并分享

赞 4

提建议

上一篇
03 | 初窥门径:我们要搭建一个怎样的微服务实战项目?
下一篇
05 | 牛刀小试:如何搭建优惠券模板服务?
 写留言

精选留言(21)

  • 蝴蝶
    2021-12-20
    我直接用的docker装了redis mysql rabbitmq,因为用的windows
    9
  • 听雨
    2021-12-20
    对于单一的技术,比如kafka, rabbitmq, clickhouse等,一般会看官方文档学习。对于涉及一个大的生态的技术,比如云原生,一般会选择买个专栏或者报个培训班快速入门(我就是报了极客时间的云原生训练营😄)

    作者回复: 阔以阔以!学习专栏是非常效率的快速入门的方式,云原生的老师是我以前ebay的同事(还给我的书写过推荐语哈哈),水平那是杠杠的

    4
  • 森林
    2021-12-20
    建议编写一个docker compose

    作者回复: 大部分初学者使用docker的经验比较有限,所以简单应用就直接安装了。后面复杂组件比如ELK的搭建是用docker做的

    3
  • 201
    2021-12-20
    开发环境主用docker compose
    3
  • 待时而发
    2021-12-20
    经典:在我这运行没事啊

    作者回复: 先重启一下,如果一次不行,那就重启两次

    3
  • 暮雨yl晨曦
    2021-12-20
    学习新技术、安装新组件,通常都是通过什么途径摸索?
    1.先从官网找文档,按照文档一步一步操作。不得不说,国外的大部分开源的技术或者组件,文档都非常全。但是国内的话,你即使按照官网文档一步一步操作,也有可能跑失败。这也是我不喜欢用国内开源组件原因之一。不过近几年好非常多了,主要是阿里贡献挺大的。
    2.google,stackoverflow,老师上节课也推荐了,这两个是个好东西。不过我正常就用google,因为google查出来的信息里,经常就包含stackoverflow了。
    3.请教前辈,我在架构技术部,组内大神多,有个部门JAVA天花板的大神,其他人也都非常厉害。不过要记住,请教别人之前,一定要带着自己的问题+思考,不要盲目的随便请教别人,不然连问题都描述不清楚,会浪费不少时间。
    展开

    作者回复: 三点都非常赞!同学应该是老司机无疑了。国内开源项目的文档建设确实很落后,就更不用说英文文档的建设了,还是需要慢慢积累

    2
  • 卟卟熊
    2021-12-21
    1、领域标准化
       优惠券下有哪些服务:
        1、用户服务
        2、优惠券模板服务
        3、优惠计算服务

        聚合(通用)服务:用户服务
        基础服务:优惠券模板服务,优惠计算服务


        
       商品下有哪些服务:
        1、用户服务
        2、商品模板服务
        3、商品SKU服务


    2、项目结构标准化
        1、api
        2、dao
        3、impl
            1、controller
            2、service

        分层、解耦
            dao中的entity是对象
            api中是对外暴露的接口信息,service的返回通过api定义的
            impl是业务逻辑

    总结的老师的思想,不喜勿喷
    展开

    作者回复: 我瞅见了SKU,同学以前应该做过商品域相关的服务:-)

    1
  • 卟卟熊
    2021-12-21
    老师orm选型的时候为什么选择hibernate,现在mybatis才是主流啊,我理解的是mybatis面向sql编程 ,更方便优化sql,但是我觉得你选型hibernate是因为他们项目都不规范,并且很早之前项目都是重用sql造成mybatis比较香的原因,如果项目标准化开发,更多的面向service层,sql就不会那么复杂了,所以标准化项目下hibernate才是正确的选择是吧?
    展开

    作者回复: 我用的是JPA更上一层的封装,也就是spring data jpa,JPA之下才是具体orm规范实现比如hibernate。超高并发场景不建议写复杂sql,尤其是微服务场景下没有那种横跨多个domain的大sql查询,mybatis自定制sql的灵活性的优势已经没那么必要,况且orm框架也具备自定义sql的能力。

    1
  • gevin
    2021-12-21
    之前用intel芯片的mac时,基本上能用docker装的服务或组件,就用docker,自从换了M1 的Mac,能用brew装的就用brew

    作者回复: 这是高手!自打使用了M1之后我已经戒掉了docker,后来知道出了支持M1的版本之后也不换了,反正也懒得当小白鼠了

    共 2 条评论
    1
  • Q
    2021-12-20
    新技术安装组件,还是看官网了,不过有时候看博客更直观一些,最近一直在处理bug,修bug前梳理别人代码逻辑是真的头疼又不得不做,一些组件报的bug只能看底层了,今天就有一个activit的问题,手画的bpmn流程图节点的循环条件是正常,代码生成bpmn流程图completionCondition里面的循环条件就会报错,条件不是一个波尔值 <![CDATA[${check==0||(nrOfCompletedInstances/nrOfInstances)>=1}]]>,生成的和手画的条件都是一样的
    展开

    作者回复: 同学一定是具有超乎常人的耐心和细致,才能在bpmn下玩的如鱼得水。我以前是直接申请转组了。。。

    1
  • 罗逸
    2021-12-20
    我之前用docker安装了这些软件0.0
    1
  • Hello world
    2021-12-20
    学习新技术和安装新组件的最好方式是看官网,不过有的官网写的比较晦涩难懂,可以搭配相关博客进行学习

    作者回复: 同学这个路子非常的效率,你实际工作中应该是个fast-learner

    1
  • Geek_e306aa
    2021-12-20
    学完了,我是第一个嘛?😜

    编辑回复: 恭喜你抢到了沙发~

    1
  • 秦旭
    2021-12-22
    老师 macOS 使用 brew install rabbitmq 安装好之后 启动时 报了 {"init terminating in do_boot",{error,{crypto,{"no such file or directory","crypto.app"}}}}
    init terminating in do_boot ({error,{crypto,{no such file or directory,crypto.app}}})
    系统已安装 erl 环境变量已配置 这个自己找了很多原因没有解决 老师帮忙看一下呗
    展开

    作者回复: 有两个方向同学可以试一下:
    1. 直接使用docker获取一个rabbitmq的镜像
    2. brew删除erlang和rabbitmq,然后重新安装一个和rabbitmq版本匹配的erlang

  • 曙光
    2021-12-22
    保姆级!太细了
  • 卡特
    2021-12-21
    docker安装比较简单

    作者回复: 是的,有docker基础的同学可以用docker安装

  • 金灶沐
    2021-12-20
    脚本错了
    -- 创建 coupon_template 数据表
    DROP IF EXISTS TABLE `geekbang_coupon_db`.`coupon_template`;

    DROP TABLE IF EXISTS`geekbang_coupon_db`.`coupon_template`;
    展开

    作者回复: 好眼力!已经提交fix

  • 塔矢亮的小螃蟹
    2021-12-20
    好棒,这些以前都装过啦,期待下一讲

    作者回复: 老司机~

  • Hello world
    2021-12-20
    打卡
  • Layne
    2021-12-20
    1.一般都是按照官方文档的简易教程来安装使用;安装过程中如果出现异常的话,会通过各大社区论坛找找是不是有类似的情况出现。也会去一些开源网站找一些运维脚本,一键部署之类的。
    2.做过一个签名排序,是利用fastjson来对json数据格式按照ASCII来进行排序,之前一直好好的,排序规则也正常。在一个老的工程中同样引入这个方法,发现不管用了,后面排查才发现是两个jar包版本不一致(吃了不少fastjson的亏),升级到最新的版本一致就OK了。
    展开

    作者回复: fastjson!!!以前阿里系的人,没少吃过这玩意儿的亏!为了fast这一个使命真的是舍命裸奔,各种短板。现在各个json库的性能也都上来了,珍爱生命,远离fastjson吧